#ifndef XXTITLEBAR_H
#define XXTITLEBAR_H

#include <QWidget>
#include <QMap>
#include <QSharedPointer>
#include <functional>
#include "../XXqtDefine.h"

namespace Ui {
class XXtitleBar;
}

class XXtitleBar : public QWidget
{
    Q_OBJECT

public:
    explicit XXtitleBar(QWidget *parent = nullptr);
    ~XXtitleBar();

    enum WindowElement{Min=0x01,R=0x02,Close=0x04,Logo=0x08,Title=0x10};
    Q_DECLARE_FLAGS(WindowElements,WindowElement)

    /**
     * @brief setWindowElementsHint，控制显示标题栏的元素
     */
    void setWindowElementsHint(WindowElements es);

    /**
     * @brief setCloseBlock 点击左上角关闭按键时的回调
     * @param willClose 返回true即可以关闭
     */
    void setCloseBlock(std::function<bool(void)> willClose);

    /**
     * @brief setTitle 设置标题
     */
    void setTitle(QString title);

    /**
     * @brief setLogo 设置左标图标
     */
    void setLogo(QIcon logo);

    /**
     * @brief setPadding 统一设置内边距
     */
    void setPadding(int padding);

    /**
     * @brief setPadding 分别设置内边距
     */
    void setPadding(int top, int left, int bottom, int right);

    /**
     * @brief setDefaultStyleEnabled 是否使用默认样式，当使用QSS时，建议设置为false
     * @param enable
     * 当使用默认样式时
     * Logo控件将会根据padding显示正方行
     * Logo控件默认margin为4
     * WindowButton控件将会根据padding显示正方形
     * WindowButton控件将会使用Qt预置ICON
     */
    void setDefaultStyleEnabled(bool enable);   // default is true, enable:setIconSquared(true);setIconMargin(4);setButtonSquared(true);setButtonMargin(4);setButtonSystemIcon(true)
    void setLogoSquared(bool squared);      // default is true
    void setLogoMargin(int margin);         // default is 4
    void setButtonSquared(bool squared);    // default is true
    void setButtonSystemIcon(bool enable);  // default is true

    /**
     * @brief addWidget 加入自定义控件
     */
    enum Position{Left,Right,/*Center,*/};
    template<typename T>
    QSharedPointer<T> addWidget(QString name, Position position){
        if(_nameToWidget.contains(name)){
            return nullptr;
        }
        QSharedPointer<T> widget(new T(this));
        widget->setObjectName(name);
        addWidget(name,widget,position);
        return widget;
    }
    /**
     * @brief removeWidget 移除自定义控件，控件将会被delete
     */
    void removeWidget(QString name);

protected:
    virtual bool eventFilter(QObject *w, QEvent *e);
    virtual void resizeEvent(QResizeEvent *event);
    virtual void mousePressEvent(QMouseEvent *event);
    virtual QSize sizeHint() const; // default height: 40

private:
    /**
     * @brief isAvailableArea 根据配置的padding判断参数point是否处于有效区域
     */
    bool isAvailableArea(QPoint point);
    /**
     * @brief setWindow 设置监控的window，当window的wtitle和wimage修改时，同步到logo和title
     */
    void setWindow(QWidget *window);
    /**
     * @brief setMaxWindowState 设置是否为最大化状态
     */
    void setMaxWindowState(bool max);
    void addWidget(QString name, QSharedPointer<QWidget> widget, Position position);
    Q_SLOT void onWindowButtonClicked(bool checked);

private:
    Ui::XXtitleBar *ui;
    /* 存储加入的自定义控件 */
    QMap<QString,QSharedPointer<QWidget>> _nameToWidget;
    /* 标记logo控件是否为正方形显示 */
    bool _logoSquared;
    /* 标记windowButton控件是否为正方形显示 */
    bool _buttonSquared;
    /* 关闭回调block */
    std::function<bool(void)> _willCloseBlock;
    /* 内边距，影响标题栏拖动触发的有效区域 */
    int _topPadding,_leftPadding,_bottomPadding,_rightPadding;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(XXtitleBar::WindowElements)
#endif // XXTITLEBAR_H
